package net.hn.hnms.biz.common.ihn.utils;

import net.hn.hnms.biz.common.ihn.result.RequestHuaNengTextBean;
import net.hn.hnms.biz.common.ihn.result.ResultTextMessage;
import net.hn.hnms.biz.common.ihn.result.ResultToken;
import net.hn.hnms.biz.common.ihn.result.TextBean;
import net.hn.hnms.sys.common.core.constant.Constants;
import net.hn.hnms.sys.common.core.exception.HuaNengException;
import net.hn.hnms.sys.common.redis.utils.RedisUtils;

import java.io.IOException;
import java.time.Duration;
import java.util.List;

/**
 * @ClassName: IhnUtil
 * @Description
 * @Author 王龙
 * @Date 2022-09-02
 * @Version 0.1
 */
public class IhnUtil {
    final static String WX_TOKEN = "WX_IHN_TOKEN";

    /**
     * 获取Token
     * @param ip 发送的ip地址或者域名（api开头）
     * @param corpid  每个企业都拥有唯一的corpid，获取此信息可在管理后台“我的企业”－“企业信息”下查看（需要有管理员权限）。
     * @param corpsecret secret是企业应用里面用于保障数据安全的“钥匙”，每一个应用都有一个独立的访问密钥，
     * @return Result对象
     */
    public static ResultToken getAccessToken(String ip, String corpid, String corpsecret) {
        ResultToken resultToken = null;
        //首先读取redis是否存在inh的token
         resultToken = RedisUtils.getCacheObject(WX_TOKEN);
        if (resultToken != null) {
            return resultToken;
        }
        //重新发送请求
        String url="https://"+ip+"/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;
        System.out.println(url);

        try {
             resultToken = HttpRestUtils.getHuaNengToken(url);
            if (resultToken == null) {
                return new ResultToken();
            }
            //将token保存到redis
            RedisUtils.setCacheObject(WX_TOKEN, resultToken, Duration.ofSeconds(Long.parseLong(resultToken.getExpires_in())));
            return resultToken;
        } catch (IOException e) {
            return new ResultToken();
        }
    }
    /**
     * 获取Token
     * @param corpid  每个企业都拥有唯一的corpid，获取此信息可在管理后台“我的企业”－“企业信息”下查看（需要有管理员权限）。
     * @param corpsecret secret是企业应用里面用于保障数据安全的“钥匙”，每一个应用都有一个独立的访问密钥，
     * @return Result对象
     */
    public static ResultToken getAccessToken(String corpid, String corpsecret) {
        ResultToken resultToken = null;
        //首先读取redis是否存在inh的token
        resultToken = RedisUtils.getCacheObject(WX_TOKEN);
        if (resultToken != null) {
            return resultToken;
        }
        //重新发送请求
        String url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret;
        System.out.println(url);
        try {
            resultToken = HttpRestUtils.getHuaNengToken(url);
            if (resultToken == null) {
                return new ResultToken();
            }
            //将token保存到redis
            RedisUtils.setCacheObject(WX_TOKEN, resultToken, Duration.ofSeconds(Long.parseLong(resultToken.getExpires_in())));
            return resultToken;
        } catch (IOException e) {
            return new ResultToken();
        }
    }
    /**
     * 获取Token
     * @param url  https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret
     * @return Result对象
     */
    public static ResultToken getAccessToken(String url) {
        ResultToken resultToken = null;
        //首先读取redis是否存在inh的token
        resultToken = RedisUtils.getCacheObject(WX_TOKEN);
        if (resultToken != null) {
            return resultToken;
        }
        System.out.println(url);
        try {
            resultToken = HttpRestUtils.getHuaNengToken(url);
            if (resultToken == null) {
                return new ResultToken();
            }
            //将token保存到redis
            RedisUtils.setCacheObject(WX_TOKEN, resultToken, Duration.ofSeconds(Long.parseLong(resultToken.getExpires_in())));
            return resultToken;
        } catch (IOException e) {
            return new ResultToken();
        }
    }

    /**
     * 发送文本消息
     * @param ip qyapi.weixin.qq.com
     * @param token this.getAccessToken()
     * @param userList
     * @param content
     * @param agentid
     * @return
     */
    public static ResultTextMessage sentTextMessage(String ip, String token, List<String> userList, String content, Integer agentid) {
        String url="https://"+ip+"/cgi-bin/message/send?access_token=" + token ;
        // 处理用户列表，将列表转换为String字符串  user1|user2|user3
        StringBuffer userString = new StringBuffer();
        for (int i = 0; i < userList.size(); i++) {
            if (i == userList.size() - 1) {
                userString.append( userList.get(i));
            }else {
                userString.append(userList.get(i) + "|");
            }
        }
        //封装发送信息内容
        RequestHuaNengTextBean request = new RequestHuaNengTextBean();
        request.setTouser(userString.toString());
        request.setAgentid(agentid);
        request.setMsgtype("text");
        //文本内容
        TextBean textBean = new TextBean();
        textBean.setContent(content);
        request.setText(textBean);
        try {
            ResultTextMessage resultTextMessage = HttpRestUtils.sendPOSTMessage(url,request);
            if (resultTextMessage == null) {
                return new ResultTextMessage();
            }
            return resultTextMessage;
        } catch (IOException e) {
            throw new HuaNengException(Constants.FAIL, "文本内容未发送成功");
        }
    }


    /**
     * 发送文本消息
     * @param url https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
     * @param userList   List<String> list = new ArrayList<>();
     *                       list.add("wanglongtemp");
     *                       list.add("123");
     * @param content   文本内容
     * @param agentid 企业应用的id 整形 1000014
     * @return
     */
    public static ResultTextMessage sentTextMessage(String url, List<String> userList, String content, Integer agentid) {
        // 处理用户列表，将列表转换为String字符串  user1|user2|user3
        StringBuffer userString = new StringBuffer();
        for (int i = 0; i < userList.size(); i++) {
            if (i == userList.size() - 1) {
                userString.append( userList.get(i));
            }else {
                userString.append(userList.get(i) + "|");
            }
        }
        //封装发送信息内容
        RequestHuaNengTextBean request = new RequestHuaNengTextBean();
        request.setTouser(userString.toString());
        request.setAgentid(agentid);
        request.setMsgtype("text");
        //文本内容
        TextBean textBean = new TextBean();
        textBean.setContent(content);
        request.setText(textBean);
        try {
            ResultTextMessage resultTextMessage = HttpRestUtils.sendPOSTMessage(url,request);
            if (resultTextMessage == null) {
                return new ResultTextMessage();
            }
            return resultTextMessage;
        } catch (IOException e) {
            throw new HuaNengException(Constants.FAIL, "文本内容未发送成功");
        }
    }

    /**
     * 发送文本消息
     * @param url https://wwlocal.qq.com/cgi-bin/message/send?access_token=ACCESS_TOKEN
     * @param userList   用户列表
     * @param content  文本内容
     * @return
     */

    public static ResultTextMessage sentTextMessage(String url, List<String> userList, String content) {
        // 处理用户列表，将列表转换为String字符串  user1|user2|user3
        StringBuffer userString = new StringBuffer();
        for (int i = 0; i < userList.size(); i++) {
            if (i == userList.size() - 1) {
                userString.append( userList.get(i));
            }else {
                userString.append(userList.get(i) + "|");
            }
        }
        //封装发送信息内容
        RequestHuaNengTextBean request = new RequestHuaNengTextBean();
        request.setTouser(userString.toString());
        request.setAgentid(1000014);
        request.setMsgtype("text");
        //文本内容
        TextBean textBean = new TextBean();
        textBean.setContent(content);
        request.setText(textBean);
        try {
            ResultTextMessage resultTextMessage = HttpRestUtils.sendPOSTMessage(url,request);
            if (resultTextMessage == null) {
                return new ResultTextMessage();
            }
            return resultTextMessage;
        } catch (IOException e) {
            throw new HuaNengException(Constants.FAIL, "文本内容未发送成功");
        }
    }
}
